package com.ssy.lingxi.settle.accounts.service;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.settle.accounts.entity.ApplyAmountDO;
import com.ssy.lingxi.settle.accounts.model.bo.InvoiceProveBO;
import com.ssy.lingxi.settle.accounts.model.vo.request.*;
import com.ssy.lingxi.settle.accounts.model.vo.response.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 业务对账单接口定义
 * @author Saske
 * @date 2021/12/7
 * @version 2.0.0
 */
public interface IBusinessReconciliationService {

    /**
     * 待对账列表
     * @author Saske
     * @param sysUser saveVo
     * @return 待对账分页列表
     **/
    Wrapper<PageData<ToBeReconciliationVO>> toBeReconciliationList(UserLoginCacheDTO sysUser, ToBeReconciliationListVO queryParameter);

    /**
     * 生成对账单数据
     * @author Saske
     * @param sysUser orderVO
     * @return 待新增对账单VO
     **/
    Wrapper<GenerateReconciliationVO> generateReconciliation(UserLoginCacheDTO sysUser, SettlementGenerateVO orders);

    /**
     * 生成请款单数据
     * @author Saske
     * @param sysUser applyVO
     * @return 对账单请款VO
     **/
    Wrapper<ApplyAmountSaveVO> generateApplyAmount(UserLoginCacheDTO sysUser, ReconciliationApplyVO applyVO);

    /**
     * 新增对账单
     * @author Saske
     * @date 2021/12/8
     * @param sysUser saveVo
     * @return 对账单id
     **/
    Wrapper<Long> save(UserLoginCacheDTO sysUser , ReconciliationSaveVo saveVo);

    /**
     * 修改对账单
     * @author Saske
     * @date 2021/12/10
     * @param sysUser saveVo
     * @return 对账单id
     **/
    Wrapper<Long> update(UserLoginCacheDTO sysUser , ReconciliationUpdateVo updateVo);

    /**
     * 删除待新增对账单
     * @param reconciliationVo      对账单操作VO
     */
    Wrapper<Long> delete(UserLoginCacheDTO sysUser, ReconciliationSubmitVo reconciliationVo);

    /**
     * 供应商提交对账单
     * @author Saske
     * @date 2021/12/10
     * @param sysUser submitVo
     * @return 对账单id
     **/
    Wrapper<Long> submitReconciliation(UserLoginCacheDTO sysUser , ReconciliationSubmitVo submitVo);

    /**
     * 采购方确认对账单
     * @author Saske
     * @date 2021/12/10
     * @param sysUser submitVo
     * @return 对账单id
     **/
    Wrapper<Long> confirmReconciliation(UserLoginCacheDTO sysUser , ReconciliationRejectConfirmVo confirmVo);

    /**
     * 查询对账单状态列表
     * @return 对账单状态列表
     */
    Wrapper<List<DropdownItem>> getStatusList(UserLoginCacheDTO sysUser);

    /**
     * 查询待对账单结算方式列表
     * @return 待对账单结算方式列表
     */
    Wrapper<List<DropdownItem>> getPayTypeList(UserLoginCacheDTO sysUser);


    /**
     * 分页查询待新增对账单列表-供应商
     * @param sysUser                           用户信息
     * @param toBeSaveReconciliationListVO      待新增对账单列表查询条件VO
     * @return 查询结果
     */
    Wrapper<PageData<ToBeSubmitReconciliationVO>> pageCreatedReconciliation(UserLoginCacheDTO sysUser, ToBeSaveReconciliationListVO toBeSaveReconciliationListVO);

    /**
     * 分页查询对账单列表-供应商
     * @param sysUser                用户信息
     * @param reconciliationListVO   对账单列表查询条件VO
     * @return 查询结果
     */
    Wrapper<PageData<ToBeSubmitReconciliationVO>> pageVendorReconciliation(UserLoginCacheDTO sysUser,ReconciliationListVO reconciliationListVO);

    /**
     * 分页查询待确认对账单列表-采购方
     * @param sysUser                           用户信息
     * @param toBeSaveReconciliationListVO      待确认对账单列表查询条件VO
     * @return 查询结果
     */
    Wrapper<PageData<ToBeConfirmReconciliationVO>> pageConfirmReconciliation(UserLoginCacheDTO sysUser, ToBeSaveReconciliationListVO toBeSaveReconciliationListVO);

    /**
     * 分页查询待请款对账单列表-采购方
     * @param sysUser                           用户信息
     * @param toBeSaveReconciliationListVO      待确认对账单列表查询条件VO
     * @return 查询结果
     */
    Wrapper<PageData<TobeApplyAmountListVO>> pageToBeApplyAmountReconciliation(UserLoginCacheDTO sysUser, ToBeSaveReconciliationListVO toBeSaveReconciliationListVO);

    /**
     * 分页查询对账单列表-采购方
     * @param sysUser                用户信息
     * @param reconciliationListVO   对账单列表查询条件VO
     * @return 查询结果
     */
    Wrapper<PageData<ToBeConfirmReconciliationVO>> pageBuyerReconciliation(UserLoginCacheDTO sysUser,ReconciliationListVO reconciliationListVO);

    /**
     * 查询对账单详情
     * @param reconciliationDetailVO  对账单详情查询条件
     * @return 对账单详情
     */
    Wrapper<ToBeSubmitReconciliationDetailVO> getInfo(UserLoginCacheDTO sysUser, ReconciliationDetailVO reconciliationDetailVO);

    /**
     * 对账单列表导出-供应商
     * @param reconciliationListVO 接口参数
     * @param response 响应体
     */
    void exportVendorReconciliation(HttpServletResponse response, ReconciliationListVO reconciliationListVO, String token);

    /**
     * 对账单列表导出-采购方
     * @param token                用户信息
     * @param reconciliationListVO 接口参数
     * @param response 响应体
     */
    void exportBuyerReconciliation(HttpServletResponse response, ReconciliationListVO reconciliationListVO, String token);

    /**
     * 通过token获取用户登录信息
     * @param token HttpHeaders信息
     * @return 缓存的用户信息
     */
    UserLoginCacheDTO needLoginFromBusinessPlatform(String token);

    /**
     * 根据查询对账id给对应对账单添加开票记录
     * @param reconciliationId 对账单id
     * @param invoiceId 开票id
     * @param proofId 开票凭证id
     * @param proveList 开票信息
     * @return 开票结果
     */
    Wrapper<Void> addInvoiceRecord(Long reconciliationId, Long invoiceId, Long proofId, List<InvoiceProveBO> proveList);

    /**
     * 更新订单收发货批次的结算标志为
     * @param applyAmountId 请款单id
     * @param reconciliationId 对账单id
     */
    Wrapper<Void> pay(Long applyAmountId,Long reconciliationId);

    /**
     * 物料对账单请款
     * @param applyAmountDO 请款单
     * @param reconciliationId 物料对账单id
     * @param sysUser 登录用户
     */
    Wrapper<Void> applyAmount(ApplyAmountDO applyAmountDO, Long reconciliationId, UserLoginCacheDTO sysUser);
}
